package fr.utt.millebornes.cartes;
import fr.utt.millebornes.exception.AvancementImpossibleAttaqueException;
import fr.utt.millebornes.exception.AvancementImpossibleEtape200Exception;
import fr.utt.millebornes.exception.AvancementImpossibleFeuVertException;
import fr.utt.millebornes.exception.AvancementImpossibleKilometresException;
import fr.utt.millebornes.exception.AvancementImpossibleRalentissementException;
import fr.utt.millebornes.exception.BotteException;
import fr.utt.millebornes.exception.CibleIncorrecteException;
import fr.utt.millebornes.exception.CibleSuicideException;
import fr.utt.millebornes.exception.CoupFourreException;
import fr.utt.millebornes.exception.DejaAttaqueException;
import fr.utt.millebornes.exception.DejaRalentiException;
import fr.utt.millebornes.exception.ImmuniseException;
import fr.utt.millebornes.exception.JoueurDebutantNonAttaquableException;
import fr.utt.millebornes.exception.MauvaiseParadeException;
import fr.utt.millebornes.exception.NonAttaqueException;
import fr.utt.millebornes.exception.NonRalentiException;
import fr.utt.millebornes.jeu.Partie;
import fr.utt.millebornes.joueur.Joueur;


public abstract class Etape extends Carte {
	protected int nombreDeKilometres;
	
	public Etape(int nombreKilometres) {
		nombreDeKilometres = nombreKilometres;
		pileDestination = Joueur.PILE_ETAPE;
	}
	
	public int getNombreDeKilometres() {
		return nombreDeKilometres;
	}
	
	public boolean isCarteEtape() {
		return true;
	}
	
	
	public boolean jouer(Joueur jsource, Joueur jcible) throws CoupFourreException, DejaAttaqueException, ImmuniseException, JoueurDebutantNonAttaquableException, DejaRalentiException, CibleSuicideException, AvancementImpossibleRalentissementException, AvancementImpossibleEtape200Exception, NonAttaqueException, MauvaiseParadeException, NonRalentiException, AvancementImpossibleAttaqueException, AvancementImpossibleFeuVertException, AvancementImpossibleKilometresException, BotteException, CibleIncorrecteException {
		if (jsource!=jcible) 
			throw new CibleIncorrecteException();
		return super.jouer(jsource, jcible);
	}
	
	public boolean peutEtrePosee(Joueur jcible) throws AvancementImpossibleAttaqueException, AvancementImpossibleFeuVertException, AvancementImpossibleKilometresException, AvancementImpossibleRalentissementException, AvancementImpossibleEtape200Exception  {
		if (!jcible.estPasAttaque())
			throw new AvancementImpossibleAttaqueException();
		if (!jcible.aPoseUneCarteFeuVert())
			throw new AvancementImpossibleFeuVertException();
		if ((jcible.getNombreDeKilometres()+nombreDeKilometres) > Partie.KILOMETRES_POUR_LA_VICTOIRE)
			throw new AvancementImpossibleKilometresException();
		return true;
		//return jcible.estAttaquable() && jcible.aPoseUneCarteFeuVert() && (jcible.getNombreDeKilometres()+nombreDeKilometres) <= Partie.KILOMETRES_POUR_LA_VICTOIRE;
	}
	
	
	protected void effetDeJeu(Joueur jsource,Joueur jcible) {
		jsource.ajouterKilometres(this.nombreDeKilometres);
	}
	
}
